package Test.PracticeCAS;

import java.util.concurrent.CountDownLatch;


public class demo {
    static int count=0;

    public static void request() throws InterruptedException {

        Thread.sleep(5);
        /**
         * Q：每次获取到的count都不一样,这是为什么？如何解决
         * A：
         *      1.count++ 是有三步来完成的;(jvm执行引擎);
         *          获取count值->讲count值+1->将这个值返回给count
         *      2.多线程情况下， 如果有A/B两个线程，同时执行到 获取count值的这个步骤
         *          那么就会导致，count值只加了1，这样就导致了结果不正确;
         *      3.解决方式，在给count++的时候，做同步处理，同时只允许一个线程处理这个代码
         *      这样的话，就不会丢数据了
         *      4.在Java中 可以使用 synchronized或 ReentrantLock都可以是先对资源的加锁
         *      保证资源的安全性和正确性
         */
        count++;
    }

    public static void main(String[] args) throws InterruptedException {

        long startTime=System.currentTimeMillis();
        int size=100;
        CountDownLatch countDownLatch=new CountDownLatch(size);

        for (int i = 0; i < size; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try{
                        for (int j = 0; j < 10; j++) {
                            request();
                        }
                    }catch (Exception e){
                        e.printStackTrace();
                    }finally {
                        countDownLatch.countDown();
                    }

                }
            }).start();
        }

        countDownLatch.await();
        long endTime=System.currentTimeMillis();

        System.out.println(endTime-startTime);
        System.out.println(count);
    }

}